home *** CD-ROM | disk | FTP | other *** search
/ MacHack 2000 / MacHack 2000.toast / pc / The Hacks / MacHacksBug / Python 1.5.2c1 / Mac / Lib / buildtools.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2000-06-23  |  8.2 KB  |  261 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 1.5)
  3.  
  4. '''tools for BuildApplet and BuildApplication'''
  5. import sys
  6. import os
  7. import string
  8. import imp
  9. import marshal
  10. import macfs
  11. import Res
  12. import MACFS
  13. import MacOS
  14. import macostools
  15. import EasyDialogs
  16. BuildError = 'BuildError'
  17. DEBUG = 1
  18. MAGIC = imp.get_magic()
  19. TEMPLATE = 'PythonInterpreter'
  20. RESTYPE = 'PYC '
  21. RESNAME = '__main__'
  22. OWNERNAME = 'owner resource'
  23. DEFAULT_APPLET_CREATOR = 'Pyta'
  24. READ = 1
  25. WRITE = 2
  26.  
  27. def findtemplate():
  28.     '''Locate the applet template along sys.path'''
  29.     for p in sys.path:
  30.         template = os.path.join(p, TEMPLATE)
  31.         
  32.         try:
  33.             (template, d1, d2) = macfs.ResolveAliasFile(template)
  34.         except (macfs.error, ValueError):
  35.             0
  36.             0
  37.             sys.path
  38.             continue
  39.         except:
  40.             0
  41.  
  42.     else:
  43.         raise BuildError, 'Template %s not found on sys.path' % `TEMPLATE`
  44.     template = template.as_pathname()
  45.     return template
  46.  
  47.  
  48. def process(template, filename, output, copy_codefragment):
  49.     if DEBUG:
  50.         progress = EasyDialogs.ProgressBar('Processing %s...' % os.path.split(filename)[1], 120)
  51.         progress.label('Compiling...')
  52.     else:
  53.         progress = None
  54.     fp = open(filename)
  55.     text = fp.read()
  56.     fp.close()
  57.     
  58.     try:
  59.         code = compile(text, filename, 'exec')
  60.     except (SyntaxError, EOFError):
  61.         raise BuildError, 'Syntax error in script %s' % `filename`
  62.  
  63.     if string.lower(filename[-3:]) == '.py':
  64.         destname = filename[:-3]
  65.         rsrcname = destname + '.rsrc'
  66.     else:
  67.         destname = filename + '.applet'
  68.         rsrcname = filename + '.rsrc'
  69.     if output:
  70.         destname = output
  71.     
  72.     
  73.     try:
  74.         os.remove(destname)
  75.     except os.error:
  76.         pass
  77.  
  78.     process_common(template, progress, code, rsrcname, destname, 0, copy_codefragment)
  79.  
  80.  
  81. def update(template, filename, output):
  82.     if DEBUG:
  83.         progress = EasyDialogs.ProgressBar('Updating %s...' % os.path.split(filename)[1], 120)
  84.     else:
  85.         progress = None
  86.     if not output:
  87.         output = filename + ' (updated)'
  88.     
  89.     
  90.     try:
  91.         os.remove(output)
  92.     except os.error:
  93.         pass
  94.  
  95.     process_common(template, progress, None, filename, output, 1, 1)
  96.  
  97.  
  98. def process_common(template, progress, code, rsrcname, destname, is_update, copy_codefragment):
  99.     template_fss = macfs.FSSpec(template)
  100.     (template_fss, d1, d2) = macfs.ResolveAliasFile(template_fss)
  101.     dest_fss = macfs.FSSpec(destname)
  102.     if DEBUG:
  103.         progress.label('Copy data fork...')
  104.         progress.set(10)
  105.     
  106.     if copy_codefragment:
  107.         tmpl = open(template, 'rb')
  108.         dest = open(destname, 'wb')
  109.         data = tmpl.read()
  110.         if data:
  111.             dest.write(data)
  112.         
  113.         dest.close()
  114.         tmpl.close()
  115.         del dest
  116.         del tmpl
  117.     
  118.     if DEBUG:
  119.         progress.label('Copy resources...')
  120.         progress.set(20)
  121.     
  122.     
  123.     try:
  124.         output = Res.FSpOpenResFile(dest_fss, WRITE)
  125.     except MacOS.Error:
  126.         Res.CreateResFile(destname)
  127.         output = Res.FSpOpenResFile(dest_fss, WRITE)
  128.  
  129.     (typesfound, ownertype) = ([], None)
  130.     
  131.     try:
  132.         input = Res.FSpOpenResFile(rsrcname, READ)
  133.     except (MacOS.Error, ValueError):
  134.         if DEBUG:
  135.             progress.inc(50)
  136.         
  137.     except:
  138.         DEBUG
  139.  
  140.     if is_update:
  141.         skip_oldfile = [
  142.             'cfrg']
  143.     else:
  144.         skip_oldfile = []
  145.     (typesfound, ownertype) = copyres(input, output, skip_oldfile, 0, progress)
  146.     Res.CloseResFile(input)
  147.     skiptypes = []
  148.     if 'vers' in typesfound:
  149.         skiptypes.append('vers')
  150.     
  151.     if 'SIZE' in typesfound:
  152.         skiptypes.append('SIZE')
  153.     
  154.     if 'BNDL' in typesfound:
  155.         skiptypes = skiptypes + [
  156.             'BNDL',
  157.             'FREF',
  158.             'icl4',
  159.             'icl8',
  160.             'ics4',
  161.             'ics8',
  162.             'ICN#',
  163.             'ics#']
  164.     
  165.     if not copy_codefragment:
  166.         skiptypes.append('cfrg')
  167.     
  168.     input = Res.FSpOpenResFile(template_fss, READ)
  169.     (dummy, tmplowner) = copyres(input, output, skiptypes, 1, progress)
  170.     Res.CloseResFile(input)
  171.     Res.UseResFile(output)
  172.     if ownertype == None:
  173.         newres = Res.Resource('\x00')
  174.         newres.AddResource(DEFAULT_APPLET_CREATOR, 0, 'Owner resource')
  175.         ownertype = DEFAULT_APPLET_CREATOR
  176.     
  177.     if code:
  178.         
  179.         try:
  180.             res = Res.Get1NamedResource(RESTYPE, RESNAME)
  181.             res.RemoveResource()
  182.         except Res.Error:
  183.             pass
  184.  
  185.         if DEBUG:
  186.             progress.label('Write PYC resource...')
  187.             progress.set(120)
  188.         
  189.         data = marshal.dumps(code)
  190.         del code
  191.         data = MAGIC + '\x00\x00\x00\x00' + data
  192.         id = 0
  193.         while id < 128:
  194.             id = Res.Unique1ID(RESTYPE)
  195.         res = Res.Resource(data)
  196.         res.AddResource(RESTYPE, id, RESNAME)
  197.         attrs = res.GetResAttrs()
  198.         attrs = attrs | 4
  199.         res.SetResAttrs(attrs)
  200.         res.WriteResource()
  201.         res.ReleaseResource()
  202.     
  203.     Res.CloseResFile(output)
  204.     dest_finfo = dest_fss.GetFInfo()
  205.     dest_finfo.Creator = ownertype
  206.     dest_finfo.Type = 'APPL'
  207.     dest_finfo.Flags = dest_finfo.Flags | MACFS.kHasBundle
  208.     dest_finfo.Flags = dest_finfo.Flags & ~(MACFS.kHasBeenInited)
  209.     dest_fss.SetFInfo(dest_finfo)
  210.     macostools.touched(dest_fss)
  211.     if DEBUG:
  212.         progress.label('Done.')
  213.     
  214.  
  215.  
  216. def copyres(input, output, skiptypes, skipowner, progress = None):
  217.     ctor = None
  218.     alltypes = []
  219.     Res.UseResFile(input)
  220.     ntypes = Res.Count1Types()
  221.     progress_type_inc = 50 / ntypes
  222.     for itype in range(1, 1 + ntypes):
  223.         type = Res.Get1IndType(itype)
  224.         alltypes.append(type)
  225.         nresources = Res.Count1Resources(type)
  226.         progress_cur_inc = progress_type_inc / nresources
  227.         for ires in range(1, 1 + nresources):
  228.             res = Res.Get1IndResource(type, ires)
  229.             (id, type, name) = res.GetResInfo()
  230.             lcname = string.lower(name)
  231.             size = res.size
  232.             attrs = res.GetResAttrs()
  233.             if DEBUG and progress:
  234.                 progress.label('Copy %s %d %s' % (type, id, name))
  235.                 progress.inc(progress_cur_inc)
  236.             
  237.             res.LoadResource()
  238.             res.DetachResource()
  239.             Res.UseResFile(output)
  240.             
  241.             try:
  242.                 res2 = Res.Get1Resource(type, id)
  243.             except MacOS.Error:
  244.                 res2 = None
  245.  
  246.             if res2:
  247.                 if DEBUG and progress:
  248.                     progress.label('Overwrite %s %d %s' % (type, id, name))
  249.                 
  250.                 res2.RemoveResource()
  251.             
  252.             res.AddResource(type, id, name)
  253.             res.WriteResource()
  254.             attrs = attrs | res.GetResAttrs()
  255.             res.SetResAttrs(attrs)
  256.             Res.UseResFile(input)
  257.         
  258.     
  259.     return (alltypes, ctor)
  260.  
  261.